package com.clstu.generic;

import java.util.ArrayList;
import java.util.List;

public class GenericExtends {
    public static void main(String[] args) {
        ArrayList<Object> al1 = new ArrayList<>();
        ArrayList<String> al2 = new ArrayList<>();
        ArrayList<AA> al3 = new ArrayList<>();
        ArrayList<BB> al4 = new ArrayList<>();
        ArrayList<CC> al5 = new ArrayList<>();

        PrintCollection1(al1);
        PrintCollection1(al2);
        PrintCollection1(al3);
        PrintCollection1(al4);
        PrintCollection1(al5);

//        PrintCollection2(al1);X//Object 不是AA的子类
//        PrintCollection2(al2);X//String  不是AA的子类
        PrintCollection2(al3);
        PrintCollection2(al4);
        PrintCollection2(al5);

        PrintCollection3(al1);
       // PrintCollection3(al2);X String 不是BB的父类
        PrintCollection3(al3);
        PrintCollection3(al4);
       // PrintCollection3(al5);X CC不是BB的父类

    }                                  //通配符，在定义泛型或者泛型传参的时候使用
    public static void PrintCollection1(List<?> c){//可以接受任意的泛型类型
        for (Object o:c) {
            System.out.println(o);
        }
    }                                                 //通配符，在定义泛型或者泛型传参的时候使用
    public static void PrintCollection2(List<? extends AA> c){//AA是上限，AA及AA的子类
        for (Object o:c) {
            System.out.println(o);
        }
    }                                         
    public static void PrintCollection3(List<? super BB> c){//？表示通配符，后面修饰的是限制条件
                                                       //BB类是下限,需要BB及BB的父类
        for (Object o:c) {
            System.out.println(o);
        }
    }
}
class AA{}
class BB extends AA{}
class CC extends BB{}